package com.sunlee.admin.api.module.job.task;

import com.alibaba.fastjson.JSON;
import com.sunlee.common.core.enums.ErrorCodeEnum;
import com.sunlee.common.core.exception.BusinessException;

import java.lang.reflect.Field;
import java.util.Objects;

/**
 * 定时任务接口，所有定时任务都要实现该接口
 *
 * @author sunlee
 */
public interface ITask {

    /**
     * 执行定时任务接口
     *
     * @param params 参数，多参数使用JSON数据
     */
    void run(String params);

    /**
     * 校验解析参数
     *
     * @param params 参数，多参数使用JSON数据
     * @param clazz  DTO类型
     * @param <T>    DTO
     * @return DTO
     */
    default <T> T validaParseParam(String params, Class<T> clazz) {
        T dto;
        try {
            String tempPlaceholder = "cL5VPkIa";
            params = params.replaceAll("\\\\", tempPlaceholder);
            dto = JSON.parseObject(params, clazz);
            // 校验参数
            if (Objects.isNull(dto)) {
                throw new BusinessException(ErrorCodeEnum.PARAM_NOT_COMPLETE);
            }

            Class<?> aClass = dto.getClass();
            Field[] declaredFields = aClass.getDeclaredFields();
            for (Field field : declaredFields) {
                field.setAccessible(true);
                Object value = field.get(dto);
                if (Objects.nonNull(value) && value instanceof String) {
                    field.set(dto, String.valueOf(value).replaceAll(tempPlaceholder, "\\\\"));
                }
            }

        } catch (BusinessException e) {
            throw e;
        } catch (Exception e) {
            throw new BusinessException("参数解析异常");
        }
        return dto;
    }

}